<?php
$this->registerResourcePackage([
	'forms'
]);
	
/**
 * Формируем форму
 * 1) полную
 * 2) частичную, состоящую из массива данных для клиент-сайд обновления состояния поля
 * 3) частичную, с массивом и контейнером подчиненных полей
 * 
 */

// нужно выстроить иерархию подчинения
// для каждого элемента может быть свой набор подчиненных 
// у которых тоже могут быть подчиненные

$masters = [];
$slaves = [];
$render = [];

foreach ($elements as $elementName => $element) {
	/* @var $element \Pinenut\Form\Element */
	if ($element->master) {
		$masters[$element->master][] = $elementName;
		$slaves[] = $elementName;
	}

	// элементы первого уровня которые нужно генерить
	// если полная форма, то это все не подчиненные,
	// если частичная - то это отмеченные элементы
	if (($partial && $element->isRender) || (!$partial && !$element->master)) {
		$render[] = $elementName;
	}
}

/**
 * Генерим элемент и сопутствующих зависимых
 * @param string $elementName
 */
if (!function_exists('renderElement')) {
	function renderElement ($elementName, $elements, $masters, $asData = false) {
		$result = '';
		if ($asData) {
			// отдаём обновленные данные по элементу
			$result .= '<span data-element-name=\'' . $elementName . '\' data-element-data = \'' 
					. json_encode($elements[$elementName]->toArray()). '\'></span>';
		} else {
			$result .= '<div class="element-block" data-element-container="'.$elementName.'">';
			$result .= $elements[$elementName]->render();
			$result .= "</div>";
		}
		// и если есть - строим подчиненные элементы
		if (isset($masters[$elementName]) && is_array($masters[$elementName])) {
			$result .= '<div data-slaves-container="'.$elementName.'">';
			foreach ($masters[$elementName] as $name) {
				$result .= renderElement($name, $elements, $masters);
			}
			$result .= "</div>";
		}
		return $result;
	};
}
if (!$partial) {
	$params['htmlOptions']['class'] = (array)$params['htmlOptions']['class'];
	$params['htmlOptions']['class'][] = 'active-form';
	$htmlOptions = $this->prepareAttr($params['htmlOptions']);
?><form <?php echo $htmlOptions ?>>
	<?php if (!empty($params['title'])) { ?>
		<div class="form-title"><?php echo $params['title'] ?></div>
	<?php } ?>
		
	<?php if (!empty($params['description'])) { ?>
		<div class="form-description"><?php echo $params['description'] ?></div>
	<?php } ?>
<input type="hidden" name="___" value="<?php echo $code?>">
<?php }

foreach ($render as $elementName) {
	echo renderElement($elementName, $elements, $masters, $partial);
}
	
if (!$partial) {	
?></form><?php } 
